package devcken.reflect;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import org.apache.commons.lang.WordUtils;

/**
 * 자바 리플렉션 유틸리티를 제공한다.
 * @author Devcken
 */
public class ReflectionUtils
{
	/**
	 * 주어진 객체의 프로퍼티에 대한 Setter를 찾아 주어진 값을 설정한다.
	 * @param target 프로퍼티를 수정하려는 객체를 설정한다.
	 * @param propertyName 수정하려는 프로퍼티의 이름을 설정한다.
	 * @param propertyCls 프로퍼티의 클래스를 설정한다.
	 * @param value 수정하려는 프로퍼티의 값을 설정한다.
	 * @throws IllegalAccessException
	 * @throws IllegalArgumentException
	 * @throws InvocationTargetException
	 * @throws NoSuchMethodException
	 * @throws SecurityException
	 */
	public static void invokeSetter(Object target, String propertyName, Class<?> propertyCls, Object value) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException
	{
		Class<?> cls = target.getClass();
		
		Method method = cls.getMethod(String.format("set%s", WordUtils.capitalize(propertyName)), propertyCls);
		
		method.invoke(target, value);
	}
	
	/**
	 * 주어진 객체의 프로퍼티에 대한 Getter를 찾아 프로퍼티 값을 가져온다.
	 * @param target 프로퍼티 값을 가져오려는 객체를 설정한다.
	 * @param propertyName 가져오려는 프로퍼티의 이름을 설정한다.
	 * @return 주어진 객체에서 프로퍼티 이름에 대한 값을 반환한다.
	 * @throws IllegalAccessException
	 * @throws IllegalArgumentException
	 * @throws InvocationTargetException
	 * @throws NoSuchMethodException
	 * @throws SecurityException
	 */
	public static Object invokeGetter(Object target, String propertyName) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException
	{
		Class<?> cls = target.getClass();
	
		Method method = cls.getMethod(String.format("get%s", WordUtils.capitalize(propertyName)));
		
		return method.invoke(target);
	}
}